在現在的專案開發中,如果不是很困難的sql,通常會使用orm來幫助開發
一方面增加開發速度,一方面減少sql的問題
但在開發的時候,如果有涉及到子母表的搜尋,就可能會遇到n+1的問題
比如
想要列出某個使用者下的訂單的所有商品的資料
在orm下可能會寫成
orders = Order.getByUserId('001') // select * from order where id = '001'
for i = 0; i < orders.length; i ++ {
order = orders[i]
product = Product.getByIds(order.productId) // select * from product where id ='p001'
}
這時候會發現會需要跟資料庫的連線會根據orders的筆數來增加,而每一次跟db的互動,都是一次資源的浪費
而為了減少這個狀況,就會需要使用join來避免這個問題出現
orders = Order.getByUserId('001').
leftJoin('product', 'product.id = order.product_id')
select * from order
left join product on order.product_id = product.id
where order.id = '001'
透過這種方式,讓資料庫先幫你把資料組好,再一次回傳,就可以大大減少重複建立連線的方式
這在使用orm的時候,要特別特別注意,如果真的發生了,就等於後端程式在對db做ddos的攻擊